import java.util.Map;

/**
 * @作者 钟先崟
 * @时间 2023-02-17 13:05
 * @说明 10. 正则表达式匹配
 * 给你一个字符串 s 和一个字符规律 p，请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
 * '.' 匹配任意单个字符
 * '*' 匹配零个或多个前面的那一个元素
 * 所谓匹配，是要涵盖 整个 字符串 s的，而不是部分字符串
 */
public class Solution {
    public static void main(String[] args) {
//        System.out.println(isMatch("aa", "a"));
//        System.out.println(isMatch("aa", "a*"));
//        System.out.println(isMatch("aa", ".*"));
        System.out.println(isMatch("aab", "c*a*b"));
    }

    public static boolean isMatch(String s, String p) {
        int lenS = s.length();
        int lenP = p.length();
        boolean[][] dp = new boolean[lenS + 1][lenP + 1];
        dp[0][0] = true;
        for (int i = 0; i < lenP; i++) {
            if (p.charAt(i) == '*') dp[0][i + 1] = dp[0][i - 1];
        }
        for (int i = 0; i < lenS; i++) {
            for (int j = 0; j < lenP; j++) {
                if (p.charAt(j) == '*') {
                    if (p.charAt(j - 1) == '.') {
                        if (dp[i + 1][j - 1] || dp[i + 1][j] || dp[i][j + 1]) dp[i + 1][j + 1] = true;
                    } else {
                        if (dp[i + 1][j - 1]
                                || dp[i + 1][j]
                                || (dp[i][j + 1] && s.charAt(i) == p.charAt(j - 1)))
                            dp[i + 1][j + 1] = true;
                    }
                } else if (p.charAt(j) == '.') {
                    dp[i + 1][j + 1] = dp[i][j];
                } else {
                    if (s.charAt(i) == p.charAt(j))
                        dp[i + 1][j + 1] = dp[i][j];
                }
            }
        }
        return dp[lenS][lenP];
    }
}
